﻿#region << 版 本 注 释 >>
/*----------------------------------------------------------------
 * 版权所有 (c) 2022   保留所有权利。
 * CLR版本：4.0.30319.42000
 * 机器名称：DESKTOP-UL84BU5
 * 公司名称：
 * 命名空间：KingerRobot.WanliMDC.SpiService.Services
 * 唯一标识：8c078fb5-f201-42b7-af3d-5bcb5563a501
 * 文件名：EquipImpl
 * 当前用户域：DESKTOP-UL84BU5
 * 
 * 创建者：zzl
 * 电子邮箱：1003590782@qq.com
 * 创建时间：2022/6/2 14:32:15
 * 版本：V1.0.0
 * 描述：
 *
 * ----------------------------------------------------------------
 * 修改人：
 * 时间：
 * 修改说明：
 *
 * 版本：V1.0.1
 *----------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
using K8.MDCBB;

namespace KingerRobot.MexicoSailunMDC.SpiService;
[Logging]
public class EquipImpl : IEquiqService
{
    private readonly static IRcsEquip _RcsEquip = new BRcsEquip();
    private readonly static IWmsEquipErrs _WmsEquipErrs = new BWmsEquipErrs();
    private readonly static IWcsEquipStatus _RcsEquipStatus = new BWcsEquipStatus();

    public PORcsEquip GetEquipEnableById(long id)
    {
        var enable = _RcsEquip.GetRcsEquipById(id);
        return enable;
    }

    public void PingEquip()
    {
        //WriteLog($"ping111", true);
        var equipList = _RcsEquipStatus.GetWcsEquipStatusAll().Where(t => t.UseFlag == 1).ToList();
        //WriteLog($"ping111037", true);
        //WriteLog($"ping111038{equipList.ToJson()}", true);
        foreach (var equip in equipList)
        {
            Ping p1 = new Ping();
            //WriteLog($"ping111041", true);
            PingReply reply = p1.Send(equip.Ip, 500); //发送主机名或Ip地址
            //WriteLog($"ping111043{equip.ToJson()}", true);

            if (reply.Status == IPStatus.Success)
            {
              
                if (equip.Status == 1)
                {
                    equip.Status = -1;
                    continue;
                }

                equip.Status = 1;
            }
            else if (reply.Status == IPStatus.TimedOut)
            {
                if (equip.Status == 2)
                {
                    equip.Status = -1;
                    continue;
                }

                equip.Status = 2;
                WriteLog($"设备IP：{equip.Ip}ping超时", true);
            }
            else
            {
                if (equip.Status == (int)reply.Status)
                {
                    equip.Status = -1;
                    continue;
                }
                equip.Status = (int)reply.Status;

                WriteLog($"设备IP：{equip.Ip}ping失败", true);
            }
            //WriteLog($"ping111077", true);
        }
        //WriteLog($"ping111076", true);
        _RcsEquipStatus.UpdateEquipStatus(equipList.Where(t => t.Status != -1).ToList());
        //WriteLog($"ping111078", true);
    }
    public int UpdateAlarm(long equipId, int alarmNo)
    {
        // 查找设备
        var equip = _RcsEquip.GetRcsEquipById(equipId);
        if (equip is null)
        {
            return 0;
        }

        if (equip.ErrCode != alarmNo)
        {
            // 修改设备状态
            _RcsEquip.UpdateEquipErrCode(equipId, alarmNo);

            // 查找没有结束的报警
            var err = _WmsEquipErrs.GetNotFinishEquipErr(equipId, alarmNo);
            if (err is not null)
            {
                // 修改其他报警数据 end_time
                _WmsEquipErrs.UpdateFinishEquipErr(equipId);
            }
        }

        // 添加报警
        if (alarmNo > 0)
        {
            // 添加当前报警数据
            _WmsEquipErrs.AddEquipErr(equipId, alarmNo);
        }
        return 1;
    }

    public int UpdateAlarmV2(long equipId, int alarmNo, string alarmCode, string alarmMsg)
    {

        if (alarmNo == 0)
        {
            // 修改其他报警数据 end_time
            return _WmsEquipErrs.UpdateFinishEquipErr(equipId);
        }

        if (alarmNo > 0)
        {
            // 查找没有结束的报警
            var err = _WmsEquipErrs.GetNotFinishEquipErr(equipId, alarmNo);
            if (err is not null && !err.ErrCodeArr.Equals(alarmCode))
            {
                // 修改其他报警数据 end_time
                _WmsEquipErrs.UpdateFinishEquipErr(equipId);
            }
            if (err is not null && err.ErrCodeArr.Equals(alarmCode))
            {
                return 1;
            }
            // 添加当前报警数据
            _WmsEquipErrs.AddEquipErr(equipId, alarmNo, alarmCode, alarmMsg);
        }

        return 1;
    }

    public int UpdateAlarmV3(long equipId, int alarmNo, string alarmCode, string alarmMsg, int? taskNo)
    {

        if (alarmNo == 0)
        {
            // 修改其他报警数据 end_time
            return _WmsEquipErrs.UpdateFinishEquipErr(equipId);
        }

        if (alarmNo > 0)
        {
            // 查找没有结束的报警
            var err = _WmsEquipErrs.GetNotFinishEquipErr(equipId, alarmNo);
            if (err is not null && !err.ErrCodeArr.Equals(alarmCode))
            {
                // 修改其他报警数据 end_time
                _WmsEquipErrs.UpdateFinishEquipErr(equipId);
            }
            if (err is not null && err.ErrCodeArr.Equals(alarmCode))
            {
                return 1;
            }
            // 添加当前报警数据
            _WmsEquipErrs.AddEquipErrV2(equipId, alarmNo, alarmCode, alarmMsg, taskNo);
        }

        return 1;
    }

    public int UpdateAlarmV4(long equipId, int alarmNo, string alarmCode, string alarmMsg, int? taskNo, int? taskNo2)
    {

        if (alarmNo == 0)
        {
            // 修改其他报警数据 end_time
            return _WmsEquipErrs.UpdateFinishEquipErr(equipId);
        }

        if (alarmNo > 0)
        {
            // 查找没有结束的报警
            var err = _WmsEquipErrs.GetNotFinishEquipErr(equipId, alarmNo);
            if (err is not null && !err.ErrCodeArr.Equals(alarmCode))
            {
                // 修改其他报警数据 end_time
                _WmsEquipErrs.UpdateFinishEquipErr(equipId);
            }
            if (err is not null && err.ErrCodeArr.Equals(alarmCode))
            {
                return 1;
            }
            // 添加当前报警数据
            _WmsEquipErrs.AddEquipErrV3(equipId, alarmNo, alarmCode, alarmMsg, taskNo, taskNo2);
        }

        return 1;
    }
}
